package com.zm.oes.controller;

import com.zm.oes.entity.*;
import com.zm.oes.serviceimpl.LoginServiceImpl;
import com.zm.oes.util.ApiResultHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
@RestController   //该注解表示这个类是一个控制器，用于处理 HTTP 请求并返回 JSON 数据
public class LoginController {

    /**
     * 这行代码声明了一个名为 loginService 的私有成员变量，类型为 LoginServiceImpl
     * 这个变量用于访问登录服务中提供的方法
     */
    @Autowired
    private LoginServiceImpl loginService;

    /**
     * 这行代码定义了一个名为 login 的方法，用于处理登录请求
     * 方法接受三个参数：login、request 和 response
     * @RequestBody 注解表示将请求体中的 JSON 数据映射到 Login 对象中
     * 登录逻辑：根据用户名和密码调用 loginService 中的相应方法进行登录验证，如果登录成功则返回相应的用户对象，并将用户信息存储在 Cookie 中
     */
    @PostMapping("/login")
    public ApiResult login(@RequestBody Login login, HttpServletRequest request, HttpServletResponse response) {

        //从登录请求中获取用户名，用户名是一个整数类型的值，因此这里使用了 Integer 类型来接收
        Integer username = login.getUsername();
        String password = login.getPassword();
        /*
            调用 LoginService 中的 adminLogin 方法进行管理员登录验证
            该方法接受用户名和密码作为参数，返回一个 Admin 对象，表示登录验证的结果。如果验证成功，则返回管理员的信息，否则返回 null
         */
        Admin adminRes = loginService.adminLogin(username, password);
        //这行代码检查管理员登录结果是否为非空，即是否成功验证了管理员身份
        if (adminRes != null) {
            //在管理员登录成功后，创建了一个名为 "rb_token" 的 Cookie，其中存储了管理员的身份标识
            Cookie token = new Cookie("rb_token", adminRes.getCardId());
            //设置了 Cookie 的路径为 "/"，表示该 Cookie 在整个网站范围内都有效
            token.setPath("/");
            //创建了一个名为 "rb_role" 的 Cookie，用于存储管理员的角色信息，这里将管理员的角色标识设置为 "0"
            Cookie role = new Cookie("rb_role", "0");
            // 同样地，设置了角色信息 Cookie 的路径为 "/"，使其在整个网站范围内有效
            role.setPath("/");

            //将cookie对象加入response响应
            response.addCookie(token);
            response.addCookie(role);
            //通过调用 ApiResultHandler 的方法构建一个 API 结果对象，其中包含了状态码为 200、消息为 "请求成功"，以及管理员登录成功后返回的管理员信息
            return ApiResultHandler.buildApiResult(200, "请求成功", adminRes);
        }

        /*
            调用 LoginService 中的 teacherLogin 方法进行教师登录验证
            该方法接受用户名和密码作为参数，返回一个 Teacher 对象，表示登录验证的结果。如果验证成功，则返回教师的信息，否则返回 null
         */
        Teacher teacherRes = loginService.teacherLogin(username,password);
        //检查教师登录验证结果是否为非空，即是否成功验证了教师身份
        if (teacherRes != null) {
            //如果教师登录验证成功，就创建一个名为 "rb_token" 的 Cookie，其中存储了教师的身份标识
            Cookie token = new Cookie("rb_token", teacherRes.getCardId());
            //设置了 Token Cookie 的路径为 "/"，表示该 Cookie 在整个网站范围内都有效
            token.setPath("/");
            //创建一个名为 "rb_role" 的 Cookie，用于存储用户角色信息，这里将教师的角色标识设置为 "1"
            Cookie role = new Cookie("rb_role", "1");
            //设置了 Role Cookie 的路径为 "/"，使其在整个网站范围内有效
            role.setPath("/");
            //将教师身份的 Cookie 添加到 HTTP 响应中，以便客户端可以保存该 Cookie
            response.addCookie(token);
            //将教师角色的 Cookie 同样添加到 HTTP 响应中
            response.addCookie(role);
            //通过调用 ApiResultHandler 的方法构建一个 API 结果对象，其中包含了状态码为 200、消息为 "请求成功"，以及教师登录成功后返回的教师信息
            return ApiResultHandler.buildApiResult(200, "请求成功", teacherRes);
        }

        Student studentRes = loginService.studentLogin(username,password);
        if (studentRes != null) {
            Cookie token = new Cookie("rb_token", studentRes.getCardId());
            token.setPath("/");
            Cookie role = new Cookie("rb_role", "2");
            role.setPath("/");
            response.addCookie(token);
            response.addCookie(role);
            return ApiResultHandler.buildApiResult(200, "请求成功", studentRes);
        }

        return ApiResultHandler.buildApiResult(400, "请求失败", null);
    }

    /**
     * 这是注销方法的定义
     * 它接受 HttpServletRequest 和 HttpServletResponse 作为参数，用于获取请求信息和向客户端发送响应
     */
    @PostMapping("/logout")
    public void logout(HttpServletRequest request, HttpServletResponse response) {
        //创建了一个 "rb_token" 的 Cookie，但是将其值设为 null，这样会使客户端的对应 Cookie 失效
        Cookie token = new Cookie("rb_token", null);
        //设置了 Token Cookie 的路径为 "/"，确保可以在整个网站范围内失效
        token.setPath("/");
        //将 Token Cookie 的最大存活时间设置为 0，这样客户端会立即删除该 Cookie
        token.setMaxAge(0);
        //创建了一个名为 "rb_role" 的 Cookie，将其值设为 null
        Cookie role = new Cookie("rb_role", null);
        //设置了 Role Cookie 的路径为 "/"
        role.setPath("/");
        //将 Role Cookie 的最大存活时间设置为 0
        role.setMaxAge(0);
        //将失效的 Token Cookie 添加到 HTTP 响应中，通知客户端删除该 Cookie
        response.addCookie(token);
        //将失效的 Role Cookie 同样添加到 HTTP 响应中

        response.addCookie(role);
    }
}
